gdksurface-win32.c: Decouple mapped state from surface creation
authorChun-wei Fan <fanchunwei@src.gnome.org>
Fri, 11 Dec 2020 02:29:28 +0000 (10:29 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Mon, 11 Jan 2021 09:53:38 +0000 (17:53 +0800)
In line with what is done with the Wayland backend, enable the mapped state
independently as needed from the toplevel surface presentation, and also enable
the mapped state if necessary when presenting the popup surface.

gdk/win32/gdksurface-win32.c

index 4c6a5067a03dbda8737f4131da209b0e2a6c0bc7..6b53b37d7f28abcd351be26465e9cec6748487ae 100644 (file)
@@ -1256,11 +1256,24 @@ gdk_win32_surface_layout_popup (GdkSurface     *surface,
     }
 }
 
+static void
+maybe_notify_mapped (GdkSurface *surface)
+{
+  if (surface->destroyed)
+    return;
+
+  if (!GDK_SURFACE_IS_MAPPED (surface))
+    {
+      gdk_surface_set_is_mapped (surface, TRUE);
+      gdk_surface_invalidate_rect (surface, NULL);
+    }
+}
+
 static void
 show_popup (GdkSurface *surface)
 {
   gdk_win32_surface_raise (surface);
-  gdk_surface_set_is_mapped (surface, TRUE);
+  maybe_notify_mapped (surface);
   show_window_internal (surface, FALSE, FALSE);
   gdk_surface_invalidate_rect (surface, NULL);
 }
@@ -4911,25 +4924,6 @@ gdk_win32_toplevel_class_init (GdkWin32ToplevelClass *class)
   gdk_toplevel_install_properties (object_class, 1);
 }
 
-static void
-show_surface (GdkSurface *surface)
-{
-  gboolean was_mapped;
-
-  if (surface->destroyed)
-    return;
-
-  was_mapped = GDK_SURFACE_IS_MAPPED (surface);
-
-  if (!was_mapped)
-    gdk_surface_set_is_mapped (surface, TRUE);
-
-  gdk_win32_surface_show (surface, FALSE);
-
-  if (!was_mapped)
-    gdk_surface_invalidate_rect (surface, NULL);
-}
-
 static gboolean
 gdk_win32_toplevel_present (GdkToplevel       *toplevel,
                             GdkToplevelLayout *layout)
@@ -4999,7 +4993,8 @@ gdk_win32_toplevel_present (GdkToplevel       *toplevel,
         gdk_win32_surface_unfullscreen (surface);
     }
 
-  show_surface (surface);
+  gdk_win32_surface_show (surface, FALSE);
+  maybe_notify_mapped (surface);
 
   if (size.shadow.is_valid)
     {
@@ -5093,8 +5088,9 @@ gdk_win32_drag_surface_present (GdkDragSurface *drag_surface,
 {
   GdkSurface *surface = GDK_SURFACE (drag_surface);
 
-  gdk_win32_surface_resize (surface, width, height);
-  show_surface (surface);
+  gdk_win32_surface_resize (surface, width, height);  
+  gdk_win32_surface_show (surface, FALSE);
+  maybe_notify_mapped (surface);
 
   return TRUE;
 }